home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / Priss / source / a64_polyphase.asm next >
Encoding:
Assembly Source File  |  2006-03-14  |  14.2 KB  |  421 lines

  1. ;    Priss (NekoAmp 2.0) - MPEG-1/2 audio decoding library
  2. ;    Copyright (C) 2003-2004 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.         .const
  19.  
  20.         align 16
  21. c2        real4    0.92387953251128674,0.92387953251128674,0.92387953251128674,0.92387953251128674
  22. c4        real4    0.70710678118654757,0.70710678118654757,0.70710678118654757,0.70710678118654757
  23. c6        real4    0.38268343236508984,0.38268343236508984,0.38268343236508984,0.38268343236508984
  24.  
  25. ; [1 .5 .5 -.5 .5 .5 .5 .5] ./ cos(pi*[0 5 6 1 4 7 2 3]/16)
  26. d        real4    +1.00000000000000,+1.00000000000000,+1.00000000000000,+1.00000000000000
  27.         real4    +0.89997622313642,+0.89997622313642,+0.89997622313642,+0.89997622313642
  28.         real4    +1.30656296487638,+1.30656296487638,+1.30656296487638,+1.30656296487638
  29.         real4    -0.50979557910416,-0.50979557910416,-0.50979557910416,-0.50979557910416
  30.         real4    +0.70710678118655,+0.70710678118655,+0.70710678118655,+0.70710678118655
  31.         real4    +2.56291544774151,+2.56291544774151,+2.56291544774151,+2.56291544774151
  32.         real4    +0.54119610014620,+0.54119610014620,+0.54119610014620,+0.54119610014620
  33.         real4    +0.60134488693505,+0.60134488693505,+0.60134488693505,+0.60134488693505
  34.  
  35. invother    dd    0, 80000000h, 0, 80000000h
  36. invall        dd    80000000h, 80000000h, 80000000h, 80000000h
  37.  
  38.         extern    leecoef1 : far
  39.         extern    leecoef2 : far
  40.  
  41.         .code
  42.  
  43. vdasm_mpegaudio_polyphase_dctinputbutterflies    proc public
  44.         xor        r9, r9
  45.         mov        r8, 48
  46.         lea        r10, leecoef1
  47.         lea        r11, leecoef2
  48. xloop:
  49.         movups    xmm0, [rdx+r9]            ;xmm0 = in[i]
  50.         movups    xmm1, [rdx+r8]            ;xmm1 = in[15-i]
  51.         movups    xmm2, [rdx+r9+64]        ;xmm2 = in[i+16]
  52.         movups    xmm3, [rdx+r8+64]        ;xmm3 = in[31-i]
  53.         shufps    xmm1, xmm1, 00011011b
  54.         shufps    xmm3, xmm3, 00011011b
  55.  
  56.         ;butterfly for first decomposition
  57.         movaps    xmm4, xmm0
  58.         movaps    xmm5, xmm1
  59.         addps    xmm0, xmm3                ;xmm0 = y0 = x0+x3
  60.         addps    xmm1, xmm2                ;xmm1 = y1 = x1+x2
  61.         subps    xmm4, xmm3                ;xmm4 = y2 = x0-x3
  62.         subps    xmm5, xmm2                ;xmm5 = y3 = x1-x2
  63.         mulps    xmm4, [r10+r9]
  64.         mulps    xmm5, [r10+r9+32]
  65.  
  66.         ;butterfly for second decomposition
  67.         movaps    xmm2, xmm0
  68.         movaps    xmm3, xmm4
  69.         addps    xmm0, xmm1                ;xmm0 = z0 = y0+y1
  70.         subps    xmm2, xmm1                ;xmm2 = z1 = y0-y1
  71.         addps    xmm3, xmm5                ;xmm3 = z2 = y2+y3
  72.         subps    xmm4, xmm5                ;xmm4 = z3 = y2-y3
  73.         mulps    xmm2, [r11+r9]
  74.         mulps    xmm4, [r11+r9]
  75.  
  76.         ;interleave in 0-2-1-3 order
  77.         movaps        xmm1, xmm0
  78.         unpcklps    xmm0, xmm3            ;xmm0 = z2B | z0B | z2A | z0A
  79.         unpckhps    xmm1, xmm3            ;xmm1 = z2D | z0D | z2C | z0C
  80.         movaps        xmm3, xmm2
  81.         unpcklps    xmm2, xmm4            ;xmm2 = z3B | z1B | z3A | z1A
  82.         unpckhps    xmm3, xmm4            ;xmm3 = z3D | z1D | z3C | z1C
  83.  
  84.         movlps    qword ptr [rcx   ], xmm0
  85.         movlps    qword ptr [rcx+ 8], xmm2
  86.         movhps    qword ptr [rcx+16], xmm0
  87.         movhps    qword ptr [rcx+24], xmm2
  88.         movlps    qword ptr [rcx+32], xmm1
  89.         movlps    qword ptr [rcx+40], xmm3
  90.         movhps    qword ptr [rcx+48], xmm1
  91.         movhps    qword ptr [rcx+56], xmm3
  92.  
  93.         add        rcx, 64
  94.         add        r9, 16
  95.         sub        r8, 16
  96.         cmp        r9, r8
  97.         jb        xloop
  98.         ret
  99. vdasm_mpegaudio_polyphase_dctinputbutterflies    endp
  100.  
  101.  
  102. vdasm_mpegaudio_polyphase_dct4x8    proc public
  103. ;    See the FPU version to get an idea of the flow of this AAN
  104. ;    implementation.  Note that we do all four DCTs in parallel!
  105.  
  106.         movlhps    xmm14, xmm6
  107.         movlhps    xmm15, xmm7
  108.  
  109.         ;even part - B3 (4a)
  110.         movaps    xmm0, [rcx+0*16]        ;xmm0 = s[0]
  111.         movaps    xmm1, [rcx+1*16]        ;xmm1 = s[1]
  112.         movaps    xmm2, [rcx+2*16]        ;xmm2 = s[2]
  113.         movaps    xmm3, [rcx+3*16]        ;xmm3 = s[3]
  114.         addps    xmm0, [rcx+7*16]        ;xmm0 = s[0]+s[7]
  115.         addps    xmm1, [rcx+6*16]        ;xmm1 = s[1]+s[6]
  116.         addps    xmm2, [rcx+5*16]        ;xmm2 = s[2]+s[5]
  117.         addps    xmm3, [rcx+4*16]        ;xmm3 = s[3]+s[4]
  118.  
  119.         ;even part - B2/~B1a (4a)
  120.         movaps    xmm4, xmm0
  121.         addps    xmm0, xmm3                ;xmm0 = b2[0] = b3[0]+b3[3]
  122.         movaps    xmm5, xmm1
  123.         addps    xmm1, xmm2                ;xmm1 = b2[1] = b3[1]+b2[2]
  124.         subps    xmm4, xmm3                ;xmm4 = b2[2] = b3[0]-b3[3]
  125.         subps    xmm5, xmm2                ;xmm5 = b2[3] = b3[1]-b3[2]
  126.  
  127.         ;even part - ~B1b/M (3a1m)
  128.         movaps    xmm2, xmm0
  129.         subps    xmm4, xmm5
  130.         addps    xmm0, xmm1                ;xmm0 = m[0] = b2[0] + b2[1]
  131.         mulps    xmm4, c4                ;xmm4 = m[2] = (b2[2] - b2[3])*c4
  132.         subps    xmm2, xmm1                ;xmm2 = m[1] = b2[0] - b2[1]
  133.  
  134.         ;even part - R1 (2a)
  135.         movaps    xmm3, xmm4
  136.         subps    xmm4, xmm5                ;xmm4 = r1[3] = m[2]-m[3]
  137.         addps    xmm3, xmm5                ;xmm3 = r1[2] = m[2]+m[3]
  138.  
  139.         ;even part - d (4m)
  140.         mulps    xmm0, [d+0*16]            ;xmm0 = out[0] = r1[0]*d[0]
  141.         mulps    xmm2, [d+4*16]            ;xmm2 = out[4] = r1[1]*d[4]
  142.         mulps    xmm3, [d+2*16]            ;xmm3 = out[2] = r1[2]*d[2]
  143.         mulps    xmm4, [d+6*16]            ;xmm4 = out[6] = r1[3]*d[6]
  144.  
  145.         ;odd part - B3 (4a)
  146.         movaps    xmm1, [rcx+0*16]
  147.         movaps    xmm5, [rcx+1*16]
  148.         movaps    xmm6, [rcx+2*16]
  149.         movaps    xmm7, [rcx+3*16]
  150.         subps    xmm1, [rcx+7*16]        ;xmm1 = b3[4] = s[0]-s[7]
  151.         subps    xmm5, [rcx+6*16]        ;xmm5 = b3[5] = s[1]-s[6]
  152.         subps    xmm6, [rcx+5*16]        ;xmm6 = b3[6] = s[2]-s[5]
  153.         subps    xmm7, [rcx+4*16]        ;xmm7 = b3[7] = s[3]-s[4]
  154.  
  155.         ;even part - writeout
  156.         movaps    [rcx+0*16], xmm0
  157.         movaps    [rcx+4*16], xmm2
  158.         movaps    [rcx+2*16], xmm3
  159.         movaps    [rcx+6*16], xmm4
  160.  
  161.         ;odd part - B2/~B1a (3a)
  162.         addps    xmm5, xmm7                ;xmm5 = b2[5] = b3[5]+b3[7]
  163.         subps    xmm7, xmm1                ;xmm7 = b2[7] = b3[7]-b3[4]
  164.         subps    xmm1, xmm6                ;xmm1 = b2[4] = b3[4]-b3[6]
  165.  
  166.         ;odd part - ~B1b/M (2a5m)
  167.         movaps    xmm0, xmm1
  168.         mulps    xmm7, c4                ;xmm7 = m[7] = c4*b2[7]
  169.         movaps    xmm2, xmm5
  170.         mulps    xmm0, c6
  171.         mulps    xmm1, c2
  172.         mulps    xmm2, c2
  173.         mulps    xmm5, c6
  174.         addps    xmm0, xmm2                ;xmm0 = m[4] = c6*b2[4] + c2*b2[5]
  175.         subps    xmm1, xmm5                ;xmm1 = m[5] = c2*b2[4] - c6*b2[5]
  176.  
  177.         ;odd part - R1a (2a)
  178.         movaps    xmm5, xmm6
  179.         addps    xmm6, xmm7                ;xmm6 = r1a[6] = m[6]+m[7]
  180.         subps    xmm5, xmm7                ;xmm5 = r1a[7] = m[6]-m[7]
  181.  
  182.         ;odd part - R1b (4a)
  183.         movaps    xmm3, xmm5
  184.         movaps    xmm4, xmm6
  185.         subps    xmm5, xmm0                ;xmm5 = r1b[7] = r1a[7]-r1a[4]
  186.         subps    xmm6, xmm1                ;xmm6 = r1b[6] = r1a[6]-r1a[5]
  187.         addps    xmm4, xmm1                ;xmm4 = r1b[5] = r1a[6]+r1a[5]
  188.         addps    xmm3, xmm0                ;xmm3 = r1b[4] = r1a[7]+r1a[4]
  189.  
  190.         ;odd part - D (4a)
  191.         mulps    xmm3, [d+1*16]
  192.         mulps    xmm4, [d+5*16]
  193.         mulps    xmm6, [d+3*16]
  194.         mulps    xmm5, [d+7*16]
  195.  
  196.         ;odd part - writeout
  197.         movaps    [rcx+1*16], xmm3
  198.         movaps    [rcx+5*16], xmm4
  199.         movaps    [rcx+3*16], xmm6
  200.         movaps    [rcx+7*16], xmm5
  201.  
  202.         movhlps    xmm6, xmm14
  203.         movhlps    xmm7, xmm15
  204.         ret
  205. vdasm_mpegaudio_polyphase_dct4x8    endp
  206.  
  207. ;void vdasm_mpegaudio_polyphase_matrixout_stereo(const float (*pSrc)[16], const float *pWinFwd, const float *pWinRev, int inc, const uint32 *pSampleInv, const sint16 *pDst, const float (*pSrcFinal)[16], const uint32 *pFinalMask);
  208.  
  209. vdasm_mpegaudio_polyphase_matrixout_stereo    proc public
  210.         ;rcx = pointer to subband samples
  211.         ;rdx = pointer to forward window
  212.         ;r8 = pointer to reverse window
  213.         ;r9 = source increment
  214.  
  215.         movlhps    xmm15, xmm6
  216.         movlhps    xmm14, xmm7
  217.  
  218.         movsxd    r9, r9d
  219.         mov        r10, [rsp+40]            ;r10 = pointer to sample inversion value
  220.         mov        r11, [rsp+48]            ;r11 = pointer to first two forward destination samples
  221.         lea        rax, [r11+120]            ;rax = pointer to first two reverse destination samples
  222.  
  223.         ;compute first sample (0)
  224.  
  225.         movaps    xmm5, xmmword ptr invother
  226.         movups    xmm0, [rdx]                ;load window samples 0-3
  227.         xorps    xmm0, xmm5                ;toggle signs on odd window samples
  228.         movaps    xmm1, xmm0
  229.         mulps    xmm0, [rcx]                ;multiply by left subband samples
  230.         mulps    xmm1, [rcx+64]            ;multiply by right subband samples
  231.         movups    xmm2, [rdx+16]            ;load window samples 4-7
  232.         xorps    xmm2, xmm5                ;toggle signs on odd window samples
  233.         movaps    xmm3, xmm2
  234.         mulps    xmm2, [rcx+16]            ;multiply by left subband samples
  235.         mulps    xmm3, [rcx+80]            ;multiply by right subband samples
  236.         addps    xmm0, xmm2
  237.         addps    xmm1, xmm3
  238.         movups    xmm2, [rdx+32]            ;load window samples 8-11
  239.         xorps    xmm2, xmm5                ;toggle signs on odd window samples
  240.         movaps    xmm3, xmm2
  241.         mulps    xmm2, [rcx+32]            ;multiply by left subband samples
  242.         mulps    xmm3, [rcx+96]            ;multiply by right subband samples
  243.         addps    xmm0, xmm2
  244.         addps    xmm1, xmm3
  245.         movups    xmm2, [rdx+48]            ;load window samples 12-15
  246.         xorps    xmm2, xmm5                ;toggle signs on odd window samples
  247.         movaps    xmm3, xmm2
  248.         mulps    xmm2, [rcx+48]            ;multiply by left subband samples
  249.         mulps    xmm3, [rcx+112]            ;multiply by right subband samples
  250.         addps    xmm0, xmm2
  251.         addps    xmm1, xmm3
  252.  
  253.         movaps    xmm2, xmm0                ;xmm2 = l3 | l2 | l1 | l0
  254.         movlhps    xmm0, xmm1                ;xmm0 = r1 | r0 | l1 | l0
  255.         movhlps    xmm1, xmm2                ;xmm1 = r3 | r2 | l3 | l2
  256.         addps    xmm0, xmm1                ;xmm0 = r1+r3 | r0+r2 | l1+l3 | l0+l2
  257.         shufps    xmm0, xmm0, 11011000b    ;xmm0 = r1+r3 | l1+l3 | r0+r2 | l0+l2
  258.         movhlps    xmm3, xmm0                ;xmm3 =   ?   |   ?   | r1+r3 | l1+l3
  259.         movaps    xmm4, [r10]
  260.         movhlps    xmm4, xmm4
  261.         addps    xmm0, xmm3                ;xmm0 = ? | ? | r | l
  262.         xorps    xmm0, xmm4
  263.         cvtps2dq    xmm0, xmm0
  264.         packssdw    xmm0, xmm0
  265.         movd    dword ptr [r11-4], xmm0
  266.  
  267.         add        rdx, 128
  268.         add        r8, 128
  269.         add        rcx, r9
  270.  
  271.         ;compute reflected samples (1-15, 17-31)
  272. xloop:
  273.         movups    xmm2, [r8+48]
  274.         shufps    xmm2, xmm2, 00011011b    ;xmm2 = reverse window
  275.         movups    xmm3, [rdx]                ;xmm3 = forward window
  276.         xorps    xmm3, invother            ;negate every other sample in forward window
  277.         movaps    xmm0, [rcx]                ;xmm0 = left source
  278.         movaps    xmm1, xmm0
  279.         mulps    xmm0, xmm2
  280.         mulps    xmm1, xmm3
  281.         movaps    xmm4, xmm0                ;xmm4 = left forward
  282.         movaps    xmm5, xmm1                ;xmm5 = left reverse
  283.         movaps    xmm0, [rcx+64]            ;xmm0 = left source
  284.         movaps    xmm1, xmm0
  285.         mulps    xmm0, xmm2
  286.         mulps    xmm1, xmm3
  287.         movaps    xmm6, xmm0                ;xmm6 = right forward
  288.         movaps    xmm7, xmm1                ;xmm7 = right reverse
  289.  
  290.         movups    xmm2, [r8+32]
  291.         shufps    xmm2, xmm2, 00011011b    ;xmm2 = reverse window
  292.         movups    xmm3, [rdx+16]            ;xmm3 = forward window
  293.         xorps    xmm3, invother            ;negate every other sample in forward window
  294.         movaps    xmm0, [rcx+16]            ;xmm0 = left source
  295.         movaps    xmm1, xmm0
  296.         mulps    xmm0, xmm2
  297.         mulps    xmm1, xmm3
  298.         addps    xmm4, xmm0                ;xmm4 += left forward
  299.         addps    xmm5, xmm1                ;xmm5 += left reverse
  300.         movaps    xmm0, [rcx+80]            ;xmm0 = left source
  301.         movaps    xmm1, xmm0
  302.         mulps    xmm0, xmm2
  303.         mulps    xmm1, xmm3
  304.         addps    xmm6, xmm0                ;xmm6 += right forward
  305.         addps    xmm7, xmm1                ;xmm7 += right reverse
  306.  
  307.         movups    xmm2, [r8+16]
  308.         shufps    xmm2, xmm2, 00011011b    ;xmm2 = reverse window
  309.         movups    xmm3, [rdx+32]            ;xmm3 = forward window
  310.         xorps    xmm3, invother            ;negate every other sample in forward window
  311.         movaps    xmm0, [rcx+32]            ;xmm0 = left source
  312.         movaps    xmm1, xmm0
  313.         mulps    xmm0, xmm2
  314.         mulps    xmm1, xmm3
  315.         addps    xmm4, xmm0                ;xmm4 += left forward
  316.         addps    xmm5, xmm1                ;xmm5 += left reverse
  317.         movaps    xmm0, [rcx+96]            ;xmm0 = left source
  318.         movaps    xmm1, xmm0
  319.         mulps    xmm0, xmm2
  320.         mulps    xmm1, xmm3
  321.         addps    xmm6, xmm0                ;xmm6 += right forward
  322.         addps    xmm7, xmm1                ;xmm7 += right reverse
  323.  
  324.         movups    xmm2, [r8]
  325.         shufps    xmm2, xmm2, 00011011b    ;xmm2 = reverse window
  326.         movups    xmm3, [rdx+48]            ;xmm3 = forward window
  327.         xorps    xmm3, invother            ;negate every other sample in forward window
  328.         movaps    xmm0, [rcx+48]            ;xmm0 = left source
  329.         movaps    xmm1, xmm0
  330.         mulps    xmm0, xmm2
  331.         mulps    xmm1, xmm3
  332.         addps    xmm4, xmm0                ;xmm4 += left forward
  333.         addps    xmm5, xmm1                ;xmm5 += left reverse
  334.         movaps    xmm0, [rcx+112]            ;xmm0 = left source
  335.         movaps    xmm1, xmm0
  336.         mulps    xmm0, xmm2
  337.         mulps    xmm1, xmm3
  338.         addps    xmm6, xmm0                ;xmm6 += right forward
  339.         addps    xmm7, xmm1                ;xmm7 += right reverse
  340.  
  341.         movaps    xmm0, xmm4                ;xmm0 = lf3 | lf2 | lf1 | lf0
  342.         movaps    xmm1, xmm5
  343.         movlhps    xmm0, xmm6                ;xmm0 = rf0 | rf1 | lf1 | lf0
  344.         movlhps    xmm1, xmm7
  345.         movhlps    xmm6, xmm4                ;xmm6 = rf3 | rf2 | lf3 | lf2
  346.         movhlps    xmm7, xmm5
  347.         addps    xmm0, xmm6                ;xmm0 = rf0+rf3 | rf1+rf2 | lf1+lf3 | lf0+lf2
  348.         addps    xmm1, xmm7
  349.         movaps    xmm2, xmm0
  350.         movaps    xmm3, xmm1
  351.         shufps    xmm0, xmm0, 10110001b    ;xmm0 = rf1+rf2 | rf0+rf3 | lf0+lf2 | lf1+lf3
  352.         shufps    xmm1, xmm1, 10110001b
  353.         addps    xmm0, xmm2                ;xmm0 = rf | rf | lf | lf
  354.         addps    xmm1, xmm3                ;xmm1 = rb | rb | lb | lb
  355.         shufps    xmm0, xmm1, 10001000b    ;xmm0 = rf | lf | rb | lb
  356.         xorps    xmm0, [r10]
  357.         cvtps2dq    xmm0, xmm0
  358.         packssdw    xmm0, xmm0
  359.         movd    dword ptr [rax], xmm0
  360.         psrldq    xmm0, 4
  361.         movd    dword ptr [r11], xmm0
  362.  
  363.         add        r11,4
  364.         sub        rax,4
  365.         add        rcx,r9
  366.         add        rdx,128
  367.         add        r8,128
  368.         cmp        r11,rax
  369.         jne        xloop
  370.  
  371.         ;do last sample (16)
  372.         mov        rcx, [rsp+56]
  373.         mov        rax, [rsp+64]
  374.         movaps    xmm5, [rax]                ;load final mask (masks out every other sample)
  375.  
  376.         movups    xmm0, [rdx]                ;load window samples 0-3
  377.         andps    xmm0, xmm5                ;mask out every other sample
  378.         movaps    xmm1, xmm0
  379.         mulps    xmm0, [rcx]                ;multiply by left subband samples
  380.         mulps    xmm1, [rcx+64]            ;multiply by right subband samples
  381.         movups    xmm2, [rdx+16]            ;load window samples 4-7
  382.         andps    xmm2, xmm5                ;mask out every other sample
  383.         movaps    xmm3, xmm2
  384.         mulps    xmm2, [rcx+16]            ;multiply by left subband samples
  385.         mulps    xmm3, [rcx+80]            ;multiply by right subband samples
  386.         addps    xmm0, xmm2
  387.         addps    xmm1, xmm3
  388.         movups    xmm2, [rdx+32]            ;load window samples 8-11
  389.         andps    xmm2, xmm5                ;mask out every other sample
  390.         movaps    xmm3, xmm2
  391.         mulps    xmm2, [rcx+32]            ;multiply by left subband samples
  392.         mulps    xmm3, [rcx+96]            ;multiply by right subband samples
  393.         addps    xmm0, xmm2
  394.         addps    xmm1, xmm3
  395.         movups    xmm2, [rdx+48]            ;load window samples 12-15
  396.         andps    xmm2, xmm5                ;mask out every other sample
  397.         movaps    xmm3, xmm2
  398.         mulps    xmm2, [rcx+48]            ;multiply by left subband samples
  399.         mulps    xmm3, [rcx+112]            ;multiply by right subband samples
  400.         addps    xmm0, xmm2
  401.         addps    xmm1, xmm3
  402.  
  403.         movaps    xmm2, xmm0                ;xmm2 = l3 | l2 | l1 | l0
  404.         movlhps    xmm0, xmm1                ;xmm0 = r1 | r0 | l1 | l0
  405.         movhlps    xmm1, xmm2                ;xmm1 = r3 | r2 | l3 | l2
  406.         addps    xmm0, xmm1                ;xmm0 = r1+r3 | r0+r2 | l1+l3 | l0+l2
  407.         shufps    xmm0, xmm0, 11011000b    ;xmm0 = r1+r3 | l1+l3 | r0+r2 | l0+l2
  408.         movhlps    xmm3, xmm0                ;xmm3 =   ?   |   ?   | r1+r3 | l1+l3
  409.         addps    xmm0, xmm3                ;xmm0 = ? | ? | r | l
  410.         xorps    xmm0, invall
  411.         cvtps2dq    xmm0, xmm0
  412.         packssdw    xmm0, xmm0
  413.         movd    dword ptr [r11], xmm0
  414.  
  415.         movhlps    xmm6, xmm15
  416.         movhlps    xmm7, xmm14
  417.         ret
  418. vdasm_mpegaudio_polyphase_matrixout_stereo    endp
  419.  
  420.         end
  421.